10243. Книга 1

 

Реализуйте структуру Book.

 

struct Book

{

  int  book_id;

  char title[50];

  char author[50];

  char subject[50];

};

 

Вход. Первая строка содержит количество записей n (n 100). Далее следуют n записей, каждое поле задано в отдельной строке. Дальше следует количество запросов q (q 100). Каждый запрос содержит book_id книги.

 

Выход. Для каждого запроса вывести название и автора книги как показано в примере. Если такой книги не существует, вывести “Book not found”.

 

Пример входа

Пример выхода

 

4

 

234

C_Programming

Nuha Ali

C Programming Tutorial

 

12

Telecom Billing

Zara Ali

Telecom Billing Tutorial

 

7865

Effective Java

Joshua Bloch

Java Programming

 

4321

Design Patterns

Elisabeth Freeman

Java Programming

 

3

12

13

4321

Telecom Billing by Zara Ali

Book not found

Design Patterns by Elisabeth Freeman

 

 

РЕШЕНИЕ

структуры

 

Анализ алгоритма

Рассмотрим несколько вариантов реализации этой задачи:

·        при помощи статического массива;

·        при помощи динамического выделения памяти;

·        при помощи списка;

 

Реализация алгоритма

Объявим струтуру Book.

 

struct Book

{

  int  book_id;

  char title[50];

  char author[50];

  char subject[50];

};

 

Объявим массив книг.

 

Book book[100];

 

Читаем входные даные. Заносим информацию о книгах в массив структур book.

 

scanf("%d", &n);

for (i = 0; i < n; i++)

{

  scanf("%d\n", &book[i].book_id);

  gets(book[i].title);

  gets(book[i].author);

  gets(book[i].subject);

}

 

Читаем количество запросов q.

 

scanf("%d", &q);

for (i = 0; i < q; i++)

{

 

Читаем book_id книги, информацию о которой следует вывести.

 

  scanf("%d", &book_id);

 

Установим flag = 0 если требуемая книга не найдена и flag = 1 иначе.

 

  int flag = 0;

 

Перебираем имеющиеся книги. Ищем среди них книгу с идентификационным номером book_id.

 

  for (j = 0; j < n; j++)

  {

 

Если требуемая книга найдена, то выводим ее название и автора.

 

    if (book_id == book[j].book_id)

    {

      printf("%s by %s\n", book[j].title, book[j].author);

      flag = 1;

      break;

    }

  }

 

Если книги в массиве структур нет, то выводим информацию об этом.

 

  if (flag == 0) printf("Book not found\n");

}

 

Реализация алгоритма – динамическое выделение памяти

 

#include <stdio.h>

 

struct Book

{

  int  book_id;

  char title[50];

  char author[50];

  char subject[50];

};

 

int q, i, j, n, book_id;

Book *book;

 

int main()

{

  scanf("%d", &n);

  book = new Book[n];

  for (i = 0; i < n; i++)

  {

    scanf("%d\n", &book[i].book_id);

    gets(book[i].title);

    gets(book[i].author);

    gets(book[i].subject);

  }

 

  scanf("%d", &q);

  for (i = 0; i < q; i++)

  {

    scanf("%d", &book_id);

    int flag = 0;

    for (j = 0; j < n; j++)

    {

      if (book_id == book[j].book_id)

      {

        printf("%s by %s\n", book[j].title, book[j].author);

        flag = 1;

        break;

      }

    }

    if (flag == 0) printf("Book not found\n");

  }

 

  delete[] book;

  return 0;

}

 

Реализация алгоритма – linked list

 

#include <stdio.h>

#include <malloc.h>

#include <string.h>

 

struct Book

{

  int  book_id;

  char title[50];

  char author[50];

  char subject[50];

  struct Book *next;

};

 

struct List

{

public:

  Book *head, *tail;

};

 

int q, i, j, n, book_id;

List *book;

 

void AddToTail(List *book, Book *temp)

{

  if (book->tail != NULL)

  {

    book->tail->next = (struct Book *)malloc(sizeof(Book));

    memcpy(book->tail->next, temp, sizeof(Book));

    book->tail = book->tail->next;

  }

  else

  {

    book->head = book->tail = (struct Book *)malloc(sizeof(Book));

    memcpy(book->head, temp, sizeof(Book));

  }

}

 

int main()

{

  scanf("%d", &n);

  book = (struct List *)malloc(sizeof(List));

  book->head = book->tail = NULL;

 

  for (i = 0; i < n; i++)

  {

    Book temp;

    scanf("%d\n", &temp.book_id);

    gets(temp.title);

    gets(temp.author);

    gets(temp.subject);

    AddToTail(book, &temp);

  }

 

  scanf("%d", &q);

  for (i = 0; i < q; i++)

  {

    scanf("%d", &book_id);

    int flag = 0;

    Book *temp = book->head;

    for (j = 0; j < n; j++)

    {

      if (book_id == temp->book_id)

      {

        printf("%s by %s\n", temp->title, temp->author);

        flag = 1;

        break;

      }

      temp = temp->next;

    }

    if (flag == 0) printf("Book not found\n");

  }

  return 0;

}